package com.yf.dxapp.module.app.service.course;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import com.yf.dxapp.module.app.component.app.QiniuFileComponent;
import com.yf.dxapp.module.app.controller.admin.course.vo.CoursePageReqVO;
import com.yf.dxapp.module.app.controller.admin.course.vo.CourseSaveReqVO;
import com.yf.dxapp.module.app.dal.dataobject.course.CourseDO;
import com.yf.dxapp.module.app.dal.dataobject.courseitem.CourseItemDO;
import com.yf.dxapp.module.app.dal.mysql.course.CourseMapper;
import com.yf.dxapp.module.app.dal.mysql.courseitem.CourseItemMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import java.util.List;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.yf.dxapp.module.app.enums.ErrorCodeConstants.DATA_NOT_EXISTS;

/**
 * 课程信息 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class CourseServiceImpl implements CourseService {

    @Resource
    private CourseMapper courseMapper;
    @Resource
    private CourseItemMapper courseItemMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createCourse(CourseSaveReqVO createReqVO) {
        // 插入
        CourseDO course = BeanUtils.toBean(createReqVO, CourseDO.class);
        courseMapper.insert(course);

        // 插入子表
        createCourseItemList(course.getId(), createReqVO.getCourseItems());
        // 返回
        return course.getId();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateCourse(CourseSaveReqVO updateReqVO) {
        // 校验存在
        validateCourseExists(updateReqVO.getId());
        // 更新
        CourseDO updateObj = BeanUtils.toBean(updateReqVO, CourseDO.class);
        courseMapper.updateById(updateObj);

        // 更新子表
        updateCourseItemList(updateReqVO.getId(), updateReqVO.getCourseItems());
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteCourse(Long id) {
        // 校验存在
        validateCourseExists(id);
        // 删除
        courseMapper.deleteById(id);

        // 删除子表
        deleteCourseItemByMainCourseId(id);
    }

    private void validateCourseExists(Long id) {
        if (courseMapper.selectById(id) == null) {
            throw exception(DATA_NOT_EXISTS);
        }
    }

    @Override
    public CourseDO getCourse(Long id) {
        return courseMapper.selectById(id);
    }

    @Override
    public PageResult<CourseDO> getCoursePage(CoursePageReqVO pageReqVO) {
        return courseMapper.selectPage(pageReqVO);
    }

    // ==================== 子表（课程明细） ====================

    private void createCourseItemList(Long mainCourseId, List<CourseItemDO> list) {
        list.forEach(o -> {
            o.setUrl(QiniuFileComponent.getSimpleUrl(o.getUrl()));
            o.setMainCourseId(mainCourseId);
        });
        courseItemMapper.insertBatch(list);
    }

    private void updateCourseItemList(Long mainCourseId, List<CourseItemDO> list) {
        deleteCourseItemByMainCourseId(mainCourseId);
        // 解决更新情况下：1）id 冲突；2）updateTime 不更新
        list.forEach(o -> o.setId(null));
        createCourseItemList(mainCourseId, list);
    }

    private void deleteCourseItemByMainCourseId(Long mainCourseId) {
        courseItemMapper.deleteByMainCourseId(mainCourseId);
    }

    @Override
    public List<CourseDO> getCourseByIds(List<Long> ids) {
        return courseMapper.selectList(CourseDO::getId, ids);
    }


}